Chainer チュートリアル 〜準備編〜
Chainer チュートリアル 〜準備編〜
1. はじめに
できる限りこのサイト以外の教科書や資料を探さなくても、このサイトだけで機械学習・ディープラーニングに入門できることを目指して、作られています。初学者の方が「何から学び始めればいいのか」と迷うことなく学習を始められることを目指したサイトです。
最高っぽい〜
2. Python入門
だいたいわかったので大丈夫
オブジェクト指向の例で House クラスを使うの、なんかわかりづらくない?「設計図」という表現を使いたかったのかな
Pythonはクラスの継承を () で表現するんだね〜。Python全然忘れている〜
zipを使うシーンは出てきそうな気がする
code:py
suffixes = '!!', '?'
for name, version, suffix in zip(names, versions, suffixes):
print('{} {} {}'.format(name, version, suffix))
Python 3.7 !!
Chainer 5.3.0 !!
rubyで書き換えるとどうなるかな
code:rb
3 pry(main)> suffixes = '!!', '?' 4 pry(main)> names.zip(versions, suffixes).each do |row| 4 pry(main)* name, version, suffix = row Python 3.7 !!
Chainer 5.3.0 !!
こんな感じかな?
これでもいけたわ。row無駄だった
code:rb
5 pry(main)> names.zip(versions, suffixes).each do |name, version, suffix| Python 3.7 !!
Chainer 5.3.0 !!
3. 機械学習に使われる数学
$ n 個目の予測値を $ y_n、目標値を $ t_n とすると ... (中略) ... そこで、200 個のデータ全てに渡って、この二乗誤差を足し合わせ、データ数の 200 で割って平均をとったものを考えます。
$ L = \frac{1}{200}\sum_{n=1}^{200}(t_{n}−y_{n})^2
... (中略) ... これは、平均二乗誤差 (mean squared error) と呼ばれ、連続値を予測する回帰問題などでよく用いられる代表的な目的関数の 1 つです。
目的関数の最適化には「微分」の知識が必要だよ、入出力が1対1ではないような問題を扱うときに「線形代数」の知識が必要だよ、データのノイズを扱うためには「確率・統計」の知識が必要だよ、という話をしてる
4. 微分の基礎
懐かしすぎる〜
$ f^{′}(x)=\lim_{h→0}\frac{f(x+h)−f(x)}{h}
微分の証明とかできそう。教えてたなぁ
2 つの関数の積の形で書かれている関数に関しては次の公式が成り立ちます。
$ (f(x)g(x))^{′} = f^{′}(x)g(x) + f(x)g^{′}(x)
あったなぁ
合成関数の微分を公式としてまとめると次のようになります。
$ \frac{d}{dx}f(g(x)) = \frac{df(u)}{du}\frac{du}{dx}
合成関数の微分...!懐かしすぎ〜
機械学習では、1つの入力変数 $ xから出力変数 $ y を予測するケースは稀であり、多くの場合、複数の入力変数 $ x_1,x_2,…,x_M を用いて $ y を予測する多変数関数が扱われます。
ふむ、そうですよね
この多変数関数において、ある入力 xm にのみ注目して微分することを 偏微分 とよび、
$ \frac{\partial}{\partial{x_m}}f(x_1,x_2,…,x_M)
と表します。
偏微分などという単語を忘れていたよ
5. 線形代数の基礎
まず始めに、スカラ、ベクトル、行列、テンソルという 4 つの言葉を解説します。
スカラ (scalar) は、$ 2.5、-1、\sqrt{2}、πといった 1 つの値もしくは変数のことを指します。スカラ変数を表すには $ \rm{x, y, M, N} のように、太字や斜体にされていない文字を利用するのが一般的です。
文字の装飾を意識しないとなぁ、めんどくせ
スカラ変数$ \rm{x}
scrapboxだと勝手に斜体になっちゃう? \rm{x} でいけた
ベクトル (vector) は、スカラを 1 方向に並べたものです。...(中略)... ベクトルを表すのに用いられる文字は、スカラと区別しやすいよう太字とするのが一般的です。
ベクトルは太字ね
ベクトル変数 $ \bm{x}
要素を縦方向に並べたものは列ベクトルと呼びます。
要素を横方向に並べたものは行ベクトルと呼びます。
行列 (matrix) は同じサイズのベクトルを複数個並べたものです。
行列変数 $ \bm{X}
テンソル (tensor) はベクトルや行列を一般化した概念です。例えば、ベクトルは 1 方向に、行列は 2 方向にスカラが並んでいます。これは「ベクトルは 1 階のテンソルで、行列は 2 階のテンソルである」であることを意味します。
テンソルってそういう概念だったのか
N 次元にスカラを並べたもの(つまり、要素を指定するのに N 個のインデックスが必要なもの)を N 階のテンソルと言います。例えば、多くのディープラーニングフレームワークでは、複数枚の画像の集まりを「画像のインデックス1つ」+「各画像のインデックス 3 つ(幅、高さ、チャンネル)」の 4 階テンソルとして表現します。
なるほどなぁ
前述のようにベクトルや行列はテンソルの一種とみなすことができますが、本資料では単に「テンソル」と言った場合は3階以上のテンソルを指します。
承知した!
同じサイズの2つのベクトルには、内積 (inner product) という演算が定義できます。
わかる
線形代数や機械学習の多くの問題で登場します行列積について説明します。 以降では明示しない限り、「行列の掛け算」と言ったときには行列積を指すこととします。
りょ。
行列$ \bm{A}と行列$ \bm{B}の行列積は$ \bm{AB}と書き 、$ \bm{A}の各行と$ \bm{B}の各列の内積を並べたものとして定義されます。https://tutorials.chainer.org/ja/_images/05_matrix_product.png
行列積は$ \bm{AB}と$ \bm{BA}が等しいとは限らないという点でスカラの掛け算と大きく異なります。
そうだね
行列に対する転置では、行と列が入れ替わるため、サイズが (N,M) だった行列は、転置するとサイズが (M,N) の行列となります。つまり、 i 行 j 列目の値が転置後には j 行 i 列目の値になります。
はい
転置の公式として次を覚えておきましょう。
(1) $ (\bm{A}^T)^T = \bm{A}
(2) $ (\bm{A}\bm{B})^T = \bm{B}^T\bm{A}^T
(3) $ (\bm{A}\bm{B}\bm{C})^T = \bm{C}^T\bm{B}^T\bm{A}^T
押忍。転置ね。
単位行列は、対角要素が全て 1 で、非対角要素が全て 0 であるような 正方行列(行数と列数が等しい行列)です。
単位行列、りょ。
単位行列はサイズが等しい任意の正方行列 A に対して以下の計算が成立します。
$ \bm{A}\bm{I}=\bm{A}
$ \bm{I}\bm{A}=\bm{A}
はい
行列で逆数に対応するものが 逆行列 (inverse matrix) です。...(中略)... 行列$ \bm{A}に対し、 $ \bm{A}\bm{B}=\bm{I} , $ \bm{B}\bm{A}=\bm{I} を満たす行列 $ \bm{B}のことを$ \bm{A}の逆行列 といいます。 このような条件を満たす行列$ \bm{B}は 行列$ \bm{A}によって存在したり存在しなかったりします。
逆行列はあったりなかったりするんだったね、思い出してきた
しかし、もし$ \bm{A}に対しこの条件を満たす行列が存在するならば、そのような行列はただ 1 つであることが知られています。
ある場合はただ一つ。
行列 $ \bm{A}の逆行列を$ \bm{A}^{-1}と書きます。
機械学習の数式で頻出する形式として、$ \bm{b}^T\bm{x}と $ \bm{x}^T\bm{A}\bm{x} の 2 つがあります。 前者は線形結合もしくは一次結合、後者は二次形式と呼ばれています。
一般に、$ x_1,…,x_Nに関する二次関数は、
$ \bm{x} = \begin{bmatrix}x_1 \\ \vdots \\ x_N \end{bmatrix}
として、
$ \bm{x}^T\bm{A}\bm{x}+\bm{b}^T\bm{x}+c
と表記できます。
ベクトルを入力にとる関数の微分を考えてみましょう。 入力ベクトルの要素毎に出力に対する偏微分を計算し、それらを並べてベクトルにしたものが勾配 (gradient) です。
入力ベクトルの要素毎に出力に対する偏微分を計算 なるほど。
多変数関数 $ f(x_1,…,x_M) は、入力をまとめて
$ \bm{x} = \begin{bmatrix}x_1 \\ \vdots \\ x_M \end{bmatrix}
と書き、 $ f(\bm{x})と表記しても構いません。
なるほど
$ f(\bm{x})の微分は、前章で説明した偏微分を各変数$ x_1,…,x_Mに対して行い
$ \frac{\partial}{\partial{\bm{x}}}f(\bm{x}) = \begin{bmatrix} \frac{\partial}{\partial{x_1}}f(\bm{x}) & \dots & \frac{\partial}{\partial{x_M}}f(\bm{x}) \end{bmatrix}
と計算します。
次に入力ではなく出力が多変数の関数を考えます。
出力がベクトルである関数を ベクトル値関数 (vector-valued function) と呼びます。それに対し、出力がスカラである関数を(そのことを強調したい場合には) スカラ値関数 (scalar-valued function) と呼びます。
ほ〜
入力変数が M 次元ベクトル、出力変数が N 次元ベクトルである関数 $ \bm{g}は
$ \bm{g}(\bm{x}) = \begin{bmatrix} g_1(\bm{x}) \\ \vdots \\ g_N(\bm{x}) \end{bmatrix} = \begin{bmatrix} g_1(x_1,…,x_M) \\ \vdots \\ g_N(x_1,…,x_M) \end{bmatrix}
と成分表示できます。
入出力が共に多変数である関数を微分する場合も、出力の成分ごとに微分します。
さっきの $ \bm{g}(\bm{x}) を微分する場合には$ g_1(\bm{x})から$ g_N(\bm{x})のそれぞれ(計N個)を、$ x_1,…,x_Mのそれぞれ(計M個)で偏微分することになるのか
N x M の行列になるね
この、すべての偏微分の組み合わせをまとめて作った行列のことを ヤコビ行列 と呼びます。
ふむふむ
先程 1 変数入力、1 変数出力の合成関数の微分(連鎖律)を説明しました。 類似の定理が多変数入力、多変数出力の場合にも成立します。 本節では多変数バージョンの合成関数の微分の公式を紹介します。
なるほど、多変数入力のベクトル値関数から成る合成関数の微分 的な感じか
$ \bm{g}を M 変数入力 N 変数出力、$ \bm{f}を N 変数入力 L 変数出力の関数とします。
これらの関数の合成 $ \bm{h}=\bm{f}(\bm{g}(\bm{x})) は M 変数入力 L 変数出力の関数であることに注意してください。
これを $ \bm{x}で微分します。 以下の式が多変数関数バージョンの合成関数の微分の公式です。
$ \frac{d}{d\bm{x}}\bm{f}(\bm{g}(\bm{x})) = \frac{\bm{f}(\bm{u})}{d\bm{u}}\frac{d\bm{u}}{d\bm{x}}
6. 確率・統計の基礎
本節では、まず事象を記述する道具として確率分布を導入し、それに関連する概念(周辺確率、条件付き確率、確率変数の独立)を解説します。
お願いします
さらにこれらの概念を用いてベイズの定理を説明します。ベイズの定理により、ある出来事が観測された時に、その原因となる出来事が起こった確率の計算ができるようになります。
ベイズね、全く覚えてない
次に、確率分布の中から観測データに適合した最適な確率分布を選択する方法である、最尤推定と事後分布最大化推定(MAP 推定)を紹介します。 機械学習の文脈では、これらは訓練モデルの「最適な」パラメータを決定することに対応します。
最尤推定ね、覚えてない
最後に、機械学習で頻繁に利用される統計学の用語(平均、分散、標準偏差、相関係数など)を解説します。
6.1. 確率・統計と機械学習の関係
多くの機械学習タスクでやりたいことは、与えられた観測データの背後にある普遍性や法則を捉え、将来の出来事に対し予測を行えること
6.2. 確率変数と確率分布
この資料では「確率」という言葉を数学的に厳密には定義しません。代わりに次のように考えます。
ほう?
ある対象としている現象の中で、様々な事象があり得るとき、それぞれの事象ごとに、それが「どの程度起きそうか」という度合いを考えます。確率とはその度合いのこととします。
なるほど承知した
そして、その確率に従って、色々な値をとりうる確率変数(random variable)を考えます。
確率変数がとりうる全ての値が、それぞれどのような確率で出現するかを表した ...(略)... このような表を確率分布 (probability distribution) と呼びます。
6.3. 同時分布・周辺確率
複数の条件を指定したときに、それらが全て同時に成り立つ確率のことを、同時確率(joint probability)と呼びます。
サイコロ2つを同時に投げる例
同時確率が与えられたとき、着目していない方の確率変数がとり得る全ての値について同時確率を計算しその和をとることを周辺化 (marginalization) と呼び、結果として得られる確率を周辺確率 (marginal probability) と呼びます。
例えばこんな感じ->$ p(X=x) = \sum_{y}p(X=x, Y=y)
また、周辺確率をその着目している確率変数がとり得る全ての値について並べて一覧にしたものが周辺確率分布 (marginal probability distribution) です。
2つの確率変数の同時確率を考えるとき、とり得る全ての組み合わせの確率を一覧にしたものが、同時分布 (joint distribution) です。
6.4. 条件付き確率
本節では、「とある条件下での着目事象の確率」を考える条件付き確率 (conditional probability) という概念を説明します。...(略)... 条件付き確率は、それらの考えうる事象のうち、特定の条件を満たした事象のみをまず抜き出し、その中で、さらに着目する特定の事象が起きる確率を考えるためのものです。
table:傘と雨
雨が降ってない 雨が降ってる
Y=0 Y=1
傘を持ってない X=0 6 / 16 3 / 16
傘を持ってる X=1 1 / 16 6 / 16
では、「客が傘を持っていた( X=1 )」という条件の下で、「そのとき雨が降っていなかった( Y=0 )」という確率は、どのようになるでしょうか?
X=1の母数が7でそのうちY=0が1なので、$ p(Y=0|X=1) = \frac{1}{7}
「ある条件下で」という制約された世界で、対象とする確率変数がとり得る値全ての確率を並べて一覧したものは条件付き分布(conditional distribution)と呼ばれ、それらの確率を全て足すと必ず 1 になります。
ふむ。周辺確率分布と似て非なるもの
一般的に、条件付き確率は以下のように定義されます。
$ p(Y=y|X=x) = \frac{p(X=x, Y=y)}{p(X=x)}
そうだね
で略記すると $ p(y|x) = \frac{p(x, y)}{p(x)}だね
「条件付き確率の定義」の式を変形すると、以下のようになります。
$ p(x, y) = p(y|x)p(x)
そうだね
Y と Z が今独立 (independent)であるという状況です。このとき、Z の実現値を z として、条件付き確率 $ p(y|z) は、Y がどうなるかが Z がどうなるかに全く関係がないことから、 $ p(y) と等しくなります
つまり、$ p(y, z) = p(y|z)p(z) = p(y)p(z)と成る
この式から、2つの確率変数が独立であるとき、同時確率はそれぞれの周辺確率の積で書けるということが言えます。
6.5. ベイズの定理
前節で説明した条件付き確率は、...(略)...「ある"原因"が生じたという条件の下で、ある"結果"が生じる確率」を考えていると捉えることができます。では、逆に「ある"結果"が観測されたというとき、ある事象が"原因"である確率」を考えるにはどうしたら良いでしょうか。
「結果 y が生じたという条件の下で原因が x である確率」を左辺に残すと、
$ p(X=x|Y=y) = \frac{p(Y=y|X=x)p(X=x)}{p(Y=y)}
が導かれます。これをベイズの定理(Bayes' theorem)と言います。
そうだね。
略記を使うと$ p(x|y) = \frac{p(x,y)}{p(y)} = \frac{p(y|x)p(x)}{p(y)} だね
「結果」が観測する前(事前)に、原因 x がそもそも生じる確率を表すので、事前確率(prior probability)と呼ばれます。
これは$ p(x)のこと
ある「結果 y」が観測されたという条件の下で(事後に)、原因 x が生じていたという確率を表すので、事後確率(posterior probability)と呼ばれます。
これは$ p(x|y)のこと
6.6. 尤度と最尤推定
確率変数 X が x という値をとる確率 $ p(X=x) を、表の代わりに、あるパラメータ $ \theta で特徴づけられた関数 $ f(x;\theta) によって表してみます。
表形式じゃなくて関数で表現しよう、ということですな。
このような関数は確率モデル(probabilistic model)とも呼ばれ、特にパラメータによって形状が決定される関数を用いる場合はパラメトリックモデル(parametric model)と呼ばれます。
確率モデルのパラメータをうまく決定することで、データの分布を表現できれば、未知のデータに対してもそれがどのくらいの確率で発生するのかといった予測が可能となったり、便利です。
便利です。 そうだね。
推定方法には様々なものがあり、どうやって推定するかは推定する人の自由ですが、本節では最も一般的な方法の一つである最尤推定を説明します。
急に「推定」と言ってるけど、これは パラメータをうまく決定する という文脈だよね?
つまり、パラメータを推定するんだよね。
さて、確率モデルがどのくらい実際の観測データに即しているかを尤度(ゆうど)(likelihood)と言い、観測されたデータをモデルに入力し、その出力をかけ合わせたもので定義されます。
ふむ
例えば、 N 個のデータ $ x_i (i=1,…,N) が独立に観測されたとき、この観測データの下での確率モデル $ f(x;\theta) の尤度は
$ L(\theta) = \prod_{i=1}^{N}f(x_i; \theta)
と計算されます。
わかったけど、確率モデル$ fの妥当性はどうやって決めるのかね。確率モデル次第だよねこれ。
確率モデルのパラメータを、それらの観測データの下での尤度が最大になるように決定する方法を、最尤(さいゆう)推定(maximum likelihood estimation)と言います。
これは何度も聞いたぜ!!
複数データに対する尤度は、 1 より小さな値の積となるため、結果は非常に小さな数になり、コンピュータでこの計算を行う際にはアンダーフローという問題が発生しやすくなります。また尤度を最大化したい場合、積の形の式の最大化は難しいことが知られています。
ふむふむ、そうだよね。そこで...?
そこで尤度の対数をとった対数尤度(log likelihood)を考えます。 $ y=\log(x) は単調増加であるため、対数をとる前後で大小関係は変わりません。そのため対数尤度を最大にするときの θ は、元の尤度も最大にします。
$ \log{L(\theta}) = \sum_{i=1}^N\log{f(x_i; \theta)}
よって、この対数尤度を最大化するパラメータ$ \thetaを求めることができれば、その値が観測データ $ x_i (i=1,…,N) の分布を最もよく表現する確率モデルのパラメータとなります。
そうだね、対数便利。
6.7. 事後確率最大化推定(MAP推定)
前節で解説した最尤推定は、...(略)... サンプルサイズが小さい場合に、実際にはほとんどあり得ない結果が求まることがあります。
ふむふむ
コインの表・裏が出る確率を推定する例を考えます。コインを 5 回投げたところ、たまたま 5 回とも表が出たとします。この場合、前節と同じ確率モデルを用いて尤度を計算し、最尤推定でモデルのパラメータを決定すると
前節と同じ確率モデル is$ f(x;\theta) = \theta^{x}(1−\theta)^{1−x}
尤度は$ \theta^5に成るので、これを最大化するのは$ \theta=1の時。つまり
これは「表が出る確率が 1 」すなわち「裏面が出る確率は 0」という推定結果が得られてしまったことを意味します。
そうだね
もし「裏が出る確率も 0 よりは大きいだろう」という事前知識を持っておりそれを活用できれば、今回のような場合でもより良い推定ができそうです。
そうだね
事前知識も考慮しながら、観測データに基づいて確率モデルのパラメータを推定する方法には、事後確率最大化(maximum a posteriori, 以降 MAP)推定があります。
おぉ〜、そんなものがあるのかぁ〜
データだけでなくパラメータも確率変数だと考える点が最尤推定とは異なっています。
なるほど、よさそう〜
パラメータを確率変数 $ \Theta とすると、このパラメータがどのような値をとるかを表す分布 $ p(\Theta) が導入できます。
これを事前分布(prior distribution)と呼び、ここに「求めたいパラメータに対する事前知識」を反映させることができます。
事前分布は聞き馴染みがあるぞ〜。さては忘れているな? ここで、 $ \Theta = \theta となる確率 $ p(\Theta = \theta)(以降は $ p(\theta) と略記)をデータの確率モデル$ f(x;\theta) とは別の確率モデル $ g(\theta;\beta) で表せば、$ \betaを人為的に与えるか、なんらかの方法で決定しておくことで、「どのような θ が起こりやすいか」という事前知識を表現することができます。
なるほどね
これも最尤推定の時と同じで確率モデル次第だな。$ gをどうやって決めるか。
MAP 推定では、観測データ $ x_i (i=1,…,N) が観測されたという条件の下で最も確率が大きくなる$ \thetaを求めます。すなわち、 $ p(\theta|x_1,…,x_N) を最大とする$ \thetaを求めます。
条件付き確率を最大化するパラメータ$ \thetaを推定する、ということだな
最尤推定の時はパラメータはあくまでも定数だったから確率モデル$ fを定義した上で尤度を出してそれを最大化するパラメータを求めていた
ベイズの定理から、事後確率は
$ p(\theta|x_1,…,x_N) = \frac{p(x_1,…,x_N|\theta)p(\theta)}{p(x_1,…,x_N)}
と書けました。
右辺の分子$ p(x_1,…,x_N|\theta)p(\theta)に着目する
$ x_1,…,x_Nが独立なので
$ p(x_1,…,x_N|\theta) = p(x_1|\theta)\times...\times p(x_N|\theta) = \prod_{i=1}^Np(x_i|\theta) =\prod_{i=1}^Nf(x_i;\theta) = L(\theta)
これは尤度を表している
また、 $ p(\theta) はパラメータが$ \thetaという値になる事前確率なので
$ p(\theta) = g(\theta;\beta)
このことから、事後分布は尤度と事前分布の積に比例するということが分かります。
MAP 推定は事前分布の設定により得られる推定値が変化します。 この事は、MAP 推定の方が事前知識により柔軟なモデリングができる半面、誤った事前知識に基づいて事前分布を設計すると、推定値が実際のデータと乖離する可能性を持つことを意味します。
6.8. 統計量
代表的な統計量として平均、分散、標準偏差を紹介します。
全国の小学生の身長と体重の分散を調べたいとします。
このとき、全国の小学生を一人の抜け漏れもなく調べたなら、集まったデータは母集団 (population) と呼ばれます。
一方、各都道府県の小学生を100人ずつ調べた場合、そのデータは標本集団 (sample population) と言います。
ふむ
一般に、標本集団のデータ数が少ないとき、標本分散は母集団の分散よりも小さくなることが知られています。
まあそうかもね
不偏分散は、その差を補正することで、母集団の分散をより正確に推定するために用います。不偏分散は抽出するデータの数(N)を増やせば、いずれ母集団の分散に一致します。また、N が大きいと標本分散と不偏分散はほぼ一致するので、たくさんのデータ数をとることができる状況では、両者に大きな違いが生じないことも多々あります。
不偏分散の分母がN-1になっているのは、分散をちょっと大きめに見積もるためなのか〜 最後に相関係数 (correlation coefficient) を紹介します。
冒頭の「紹介します」に含まれてないけど、これは統計量ではないのか?
相関係数の中でも良く用いられるピアソンの相関係数は以下のように定義されます。
$ r=\frac{\sum_{n=1}^{N}(x_n - \bar{x})(y_n - \bar{y})}{\sqrt{(\sum_{n=1}^{N}(x_n - \bar{x})^2)(\sum_{n=1}^{N}(y_n - \bar{y})^2)}}